package org.bibpessoal.entidades;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;

@NamedQueries({
	@NamedQuery(
			name="Livro.getLivrosByUsuario",
			query="SELECT l FROM Livro l WHERE l.usuario.id = :idUsuario"),
	@NamedQuery(
		name  = "Livro.findByTitle", 
		query = "SELECT l FROM Livro l JOIN l.autores a WHERE (l.titulo = :titulo OR a.nome = :titulo) AND l.usuario.id = :idUsuario"
	),
	// Busca pelos livros emprestados a mais de um mês
	// OBS.: o calculo é feito externamente (no DAO) pois o JPQL não suporta operações com datas
	// SEE: http://www.codingpedia.org/ama/how-to-add-or-substract-a-time-period-to-a-date-in-java-persistence-query-language-jpql/
	// DUVIDA: a lista de livros é emprestada DO o usuário logado ou POR ELE??
	@NamedQuery(
		name  = "Livro.findEmprestadosAMaisDeUmMes",
		query = "SELECT l, e.data FROM Livro l JOIN l.emprestimos e WHERE e.data <= :dataParaComparar"
	)

})

@Entity
public class Livro implements Serializable {
	private static final long serialVersionUID = -3726741303207646559L;
	private int id;
	private int anoPub;
	private String titulo, isbn;
	private Usuario usuario;
	private List<Autor> autores;
	private List<Emprestimo> emprestimos;


	public Livro() {
		super();
		this.autores = new ArrayList<Autor>();
		this.emprestimos = new ArrayList<Emprestimo>();
	}

	public Livro(int id, int anoPub, String titulo, String isbn) {
		super();
		this.id = id;
		this.anoPub = anoPub;
		this.titulo = titulo;
		this.isbn = isbn;
		this.autores = new ArrayList<Autor>();
		this.emprestimos = new ArrayList<Emprestimo>();
	}

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getAnoPub() {
		return anoPub;
	}

	public void setAnoPub(int anoPub) {
		this.anoPub = anoPub;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getIsbn() {
		return isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	@ManyToOne
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	@ManyToMany(fetch = FetchType.EAGER)
	public List<Autor> getAutores() {
		return autores;
	}

	public void setAutores(List<Autor> autores) {
		this.autores = autores;
	}
	
	public String getListaAutores() {
		return this.getAutores().toString() ;
	}
	
	@OneToMany(mappedBy = "livro")
	public List<Emprestimo> getEmprestimos() {
		return emprestimos;
	}

	public void setEmprestimos(List<Emprestimo> emprestimos) {
		this.emprestimos = emprestimos;
	}
}
